#include <iostream>
#include <sstream>
#include <string>

#include "ListaEnvio.h"
#include "NodoEnvio.h"

using namespace std;

/*--------------Constructores y destructores-----*/
ListaEnvio::ListaEnvio()
{
    primero = actual = NULL;
}
ListaEnvio::~ListaEnvio()
{
    actual = primero;
    while(primero){
         actual= primero;
	   primero=primero->getSigNodo();
         delete actual; 		    }
    actual=NULL;
    primero=NULL;

}
/*-----------------------------------------------*/

/*--------------Metodos set y get---------------*/
void ListaEnvio::setPrimero(NodoEnvio* prim)
{
    primero = prim;
}
NodoEnvio* ListaEnvio::getPrimero()
{
    return primero;
}
void ListaEnvio::setActual(NodoEnvio *actu)
{
    actual = actu;
}
NodoEnvio* ListaEnvio::getActual()
{
    return actual;
}


/*-----------------------------------*/


/*------------Metodos importantes----*/
void ListaEnvio::insertarPrimero(Envios *c)
{
    if(primero == NULL)
    {
        primero = new NodoEnvio(c,NULL);
    }
    else
    {
        actual = new NodoEnvio(c,primero);
        primero = actual;

    }
}
void ListaEnvio::borrarPrimero()
{
    if(primero != NULL && primero->getSigNodo() != NULL)
    {
        actual = primero->getSigNodo();
        delete primero;
        primero = actual;
    }
    else
    {
        if(primero->getSigNodo() == NULL)
        {
            delete primero;
            primero = NULL;
        }
    }
}

void ListaEnvio::insertarFinal(Envios *c)
{
    if(primero == NULL)
    {
        primero = new NodoEnvio(c,NULL);
    }
    else
    {
        actual = primero;
        while(actual->getSigNodo() != NULL)
        {
            actual = actual->getSigNodo();
        }
        actual->setSigNodo(new NodoEnvio(c,NULL));
    }
}

void ListaEnvio::borrarFinal()
{
    if(primero == NULL)
    {
        cout<<"La lista esta vacia\n";
    }
    else
    {
        if(primero->getSigNodo() == NULL)
        {
            delete primero;
            primero = NULL;
        }
        else
        {
            actual = primero->getSigNodo();
            while(actual->getSigNodo()->getSigNodo() != NULL)
            {
                actual = actual->getSigNodo();
            }
            delete actual->getSigNodo();
            actual->setSigNodo(NULL);
        }
    }
}

Envios* ListaEnvio::buscarPorID(string id)

{
    if(primero != NULL && primero->getSigNodo() != NULL)
    {
        actual = primero;

        while(actual->getSigNodo() != NULL || actual->getEnvio()->getNumID() != id)
        {
            actual = actual->getSigNodo();
        }
        return actual->getEnvio();
    }
    else if(primero->getSigNodo() == NULL && primero->getSigNodo()->getEnvio()->getNumID() == id)
            return primero->getEnvio();
}

void ListaEnvio::mostrarListaEnvios()
{
    actual = primero;
    if(actual == NULL)
    {
        cout<<"La lista esta vacia\n";
    }
    else if(actual->getSigNodo() != NULL)
    {
        while(actual->getSigNodo() != NULL)
        {
            actual->getEnvio()->mostrarEnvio();
            actual = actual->getSigNodo();
        }
    }
    else
    {
       primero->getEnvio()->mostrarEnvio();
    }
}

